home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 August / CHIP_CD_2004-08.iso / software / amc / amc_install.exe / {app} / Scripts / All Movie Guide (pic).ifs < prev    next >
Encoding:
Text File  |  2004-03-20  |  8.8 KB  |  238 lines

  1. // GETINFO SCRIPTING
  2. // All Movie Guide (US) import
  3.  
  4. (***************************************************
  5.  *  Movie importation script for:                  *
  6.  *  All Movie Guide (US), http://allmovie.com      *
  7.  *                                                 *
  8.  *  (c) 2003 Hubert Kosior                         *
  9.  *       send bugs and reports to: hubert@tm1.net  *
  10.  *                                                 *
  11.  *  For use with Ant Movie Catalog 3.4.1           *
  12.  *  www.antp.be/software/moviecatalog              *
  13.  *                                                 *
  14.  *  This program is free software; you can         *
  15.  *  redistribute it and/or modify it under the     *
  16.  *  terms of the GNU General Public License as     *
  17.  *  published by the Free Software Foundation;     *
  18.  *  either version 2 of the License, or (at your   *
  19.  *  option) any later version.                     *
  20.  ***************************************************)
  21.  
  22. // to do:
  23. // - producer's name instad of producing company
  24. // - display movie categories when movie list hit (after searching)
  25.  
  26. program AllMovie;
  27. var
  28.   MovieName: string;
  29.  
  30. // simple string procedures
  31. function StringReplaceAll(S, Old, New: string): string;
  32. begin
  33.   while Pos(Old, S) > 0 do
  34.     S := StringReplace(S, Old, New);
  35.   Result := S;
  36. end;
  37. procedure CutAfter(var Str: string; Pattern: string);
  38. begin
  39.   Str := Copy(str, Pos(Pattern, Str) + Length(Pattern), Length(Str));
  40. end;
  41. procedure CutBefore(var Str: string; Pattern: string);
  42. begin
  43.   Str := Copy(Str, Pos(Pattern, Str), Length(Str));
  44. end;
  45.  
  46. // Loads and analyses page from internet (list of movies or direct hit)
  47. procedure AnalyzePage(Address: string);
  48. var
  49.   Page: TStringList;
  50. begin
  51.   Page := TStringList.Create;
  52.   Page.Text := GetPage(Address);
  53.   // movie list
  54.   if Pos('movie titles like: ', Page.Text) > 0 then
  55.   begin
  56.     PickTreeClear;
  57.     PickTreeAdd('Search results', '');
  58.     AddMoviesTitles(Page);
  59.     if PickTreeExec(Address) then
  60.       AnalyzePage(Address);
  61.   // refine search
  62.   end
  63.   else
  64.   if Pos('Sorry, there is too many possible matches, please adjust your search.', Page.Text) > 0 then
  65.   begin
  66.     ShowMessage('Sorry, there is too many possible matches, please adjust your search.');
  67.     if Input('All Movie Import', 'Enter the title of the movie:', MovieName) then
  68.       AnalyzePage('http://allmovie.com/cg/avg.dll?p=avg&type=2&srch=' + URLEncode(MovieName));
  69.   // direct hit
  70.   end
  71.   else
  72.   begin
  73.     SetField(FieldURL, Address);
  74.     AnalyzeMoviePage(Page)
  75.   end;
  76. end;
  77.  
  78. // Extracts movie details from page
  79. procedure AnalyzeMoviePage(MoviePage: TStringList);
  80. var
  81.   Page: string;
  82.   Value: string;
  83. begin
  84.   Page := MoviePage.Text;
  85.  
  86.   // Original title
  87.   SetField(fieldOriginalTitle, GetStringFromHTML(Page, '<TITLE>', ': ', '</TITLE>'));
  88.  
  89.   // Year
  90.   SetField(fieldYear, GetStringFromHTML(Page, '<B>'+GetField(fieldOriginalTitle)+'</B>', '</TR>', '</B>'));
  91.  
  92.   // Country
  93.   SetField(fieldCountry, GetStringFromHTML(Page, '<B>'+GetField(fieldOriginalTitle)+'</B>', '<I>', '</I>'));
  94.  
  95.   // Length
  96.   SetField(fieldLength, GetStringFromHTML(Page, '<B>'+GetField(fieldOriginalTitle)+'</B>', '</I> - ', ' min'));
  97.  
  98.   // AKA -> translated title
  99.   SetField(fieldTranslatedTitle, GetStringFromHTML(Page, '>AKA', '</TD>', '</td>'));
  100.  
  101.   // Rating (multiplied by 2, because 0 <= AMG rating <= 5)
  102.   Value := GetStringFromHTML(Page, '>AMG Rating', 'alt="', ' Stars');
  103.   if Length(Value) > 0 then SetField(fieldRating, FloatToStr(StrToFloat(Value)*2));
  104.  
  105.   // Director
  106.   SetField(fieldDirector, GetStringFromHTML(Page, '>Director', '</TD>', '</td>'));
  107.  
  108.   // Genre -> category
  109.   SetField(fieldCategory, GetStringFromHTML(Page, '>Genre/Type', '</TD>', '</td>'));
  110.  
  111.   // Producing company  -> producer
  112.   SetField(fieldProducer, GetStringFromHTML(Page, '>Produced by', '</TD>', '</TD>'));
  113.  
  114.   // Image
  115.   Value := GetStringFromHTML(Page, 'http://image.allmusic.com', '', '"');
  116.   if Length(Value) > 0 then GetPicture(Value, False);
  117.  
  118.   // Plot synopsis -> description
  119.   Value := GetStringFromHTML(Page, '<A Name="PLOT">', '</table>', '</table>');
  120.   if Length(Value) > 0 then SetField(fieldDescription, 'PLOT SYNOPSIS:'+#13#10+Value+#13#10);
  121.  
  122.   // Review -> description
  123.   Value := GetStringFromHTML(Page, '<A Name="REVIEW">', '</table>', '</table>');
  124.   if Length(Value) > 0 then SetField(fieldDescription, GetField(fieldDescription)+'AMG REVIEW:'+#13#10+Value+#13#10);
  125.  
  126.   // Awards -> description
  127.   // adjust spaces and line feeds
  128.   Value := StringReplaceAll(Page, '> <FONT', ''); // space before title
  129.   Value := StringReplaceAll(Value, '</FONT> </td><td WIDTH=209>', ' - '); // minus before name
  130.   Value := StringReplaceAll(Value, ' </A></FONT></td>', ' - '); // minus after name (1)
  131.   Value := StringReplaceAll(Value, ' </FONT></td>', ' - '); // minus after name (2)
  132.   Value := StringReplaceAll(Value, '</FONT> </td></tr>', + #13#10); // newline after academy name
  133.   Value := GetStringFromHTML(Value, '<A Name="AWRD">', '</td></tr>', '</TABLE>');
  134.   Value := StringReplaceAll(Value, '  ', ' ');
  135.   Value := StringReplaceAll(Value, ' - - ', ' - ');
  136.   if Length(Value) > 0 then SetField(fieldDescription, GetField(fieldDescription)+'AWARDS:'+#13#10+Value);
  137.  
  138.   // remove trailing newline from description
  139.   Value := GetField(fieldDescription);
  140.   if Copy(Value, Length(Value) - 1, 2) = #13#10 then begin
  141.     Value := Copy(Value, 0, Length(Value) - 2);
  142.     SetField(fieldDescription, Value);
  143.   end;
  144.  
  145.   // Cast -> actors
  146.   // adjust semicolons
  147.   Value := StringReplaceAll(Page, '</I></TD></TR>', '; ');
  148.   Value := GetStringFromHTML(Value, '<A Name="CAST">', '</td></tr>', '</TABLE>');
  149.   if Length(Value) > 0 then begin
  150.     // remove double spaces if only actor name given
  151.     while Pos('  ', Value) > 0 do
  152.       Delete(Value, Pos('  ', Value), 2);
  153.     // remove trailing "; "
  154.     if Copy(Value, Length(Value) - 1, 2) = '; ' then
  155.       Value := Copy(Value, 0, Length(Value) - 2);
  156.     SetField(fieldActors, Value)
  157.   end;
  158.  
  159.   DisplayResults;
  160. end;
  161.  
  162. // Adds movie titles from search results to tree
  163. procedure AddMoviesTitles(ResultsPage: TStringList);
  164. var
  165.   Page: string;
  166.   MovieTitle, MovieAddress: string;
  167. begin
  168.   Page := ResultsPage.Text;
  169.   // Every movie entry begins with string "<A HREF='/cg/avg.dll?"
  170.   while Pos('<A HREF="/cg/avg.dll?', Page) > 0 do
  171.   begin
  172.     CutBefore(Page, '<A HREF="/cg/avg.dll?');
  173.     MovieAddress := 'http://allmovie.com' + GetStringFromHTML(Page, '<A', '"', '">');
  174.     MovieTitle := GetStringFromHTML(Page, '<A', '', '</tr>');
  175.     MovieTitle := StringReplace(MovieTitle, ')', '),  ');
  176.     CutAfter(Page, '</tr>');
  177.     // add movie to list
  178.     PickTreeAdd(MovieTitle, MovieAddress);
  179.   end;
  180. end;
  181.  
  182. // Extracts single movie detail (like director, genre) from page
  183. function GetStringFromHTML(Page, StartTag, CutTag, EndTag: string): string;
  184. begin
  185.   Result := '';
  186.   // recognition tag - if present, extract detail from page, otherwise assume detail is not present
  187.   if Pos(StartTag, Page) > 0 then begin
  188.     CutBefore(Page, StartTag);
  189.     // optional cut tag helps finding right string in html page
  190.     if Length(CutTag) > 0 then
  191.       CutAfter(Page, CutTag);
  192.     // movie detail copied with html tags up to end string
  193.     Result := Copy(Page, 0, Pos(EndTag, Page) - 1);
  194.     // remove html tags and decode html string
  195.     HTMLRemoveTags(Result);
  196.     HTMLDecode(Result);
  197. //  ShowMessage('DEBUG: GetStringFromHTML - StartTag "'+StartTag+'", CutTag "'+CutTag+'", EndTag "'+EndTag+'", Result "'+Result+'" ___ '+Page);
  198.   end;
  199. end;
  200.  
  201. procedure RemovePronoun(var Str: string);
  202. var
  203.   i: Integer;
  204.   s: string;
  205.   c: char;
  206. begin
  207.   // remove pronouns
  208.   if (Copy(Str, 0, 2) = 'L ') or (Copy(Str, 0, 2) = 'A ') then
  209.     Str := Copy(Str, 3, Length(Str) - 2)
  210.   else if (Copy(Str, 0, 3) = 'Le ') or (Copy(Str, 0, 3) = 'La ') or (Copy(Str, 0, 3) = 'Un ') then
  211.     Str := Copy(Str, 4, Length(Str) - 3)
  212.   else if (Copy(Str, 0, 4) = 'Les ') or (Copy(Str, 0, 4) = 'Une ') or (Copy(Str, 0, 4) = 'The ') then
  213.     Str := Copy(Str, 5, Length(Str) - 4);
  214.  
  215.   // remove non-letters, non-digits and non-spaces
  216.   s := '';
  217.   for i := 1 to Length(Str) do begin
  218.   c := StrGet(Str, i);
  219.     if ((c<'a') or (c>'z')) and
  220.        ((c<'A') or (c>'Z')) and
  221.        ((c<'0') or (c>'9')) and
  222.        (c<>' ') then
  223.     else
  224.       s := s + Copy(Str, i, 1);
  225.   end;
  226.   Str := s;
  227. end;
  228.  
  229. begin
  230.   if CheckVersion(3,4,1) then begin
  231.     MovieName := GetField(fieldOriginalTitle);
  232.     if MovieName = '' then MovieName := GetField(fieldTranslatedTitle);
  233.     RemovePronoun(MovieName);
  234.     if Input('All Movie Import', 'Enter the title of the movie (only letters, digits and spaces):', MovieName) then
  235.       AnalyzePage('http://allmovie.com/cg/avg.dll?p=avg&type=2&srch=' + URLEncode(MovieName));
  236.   end else ShowMessage('This script requires a newer version of Ant Movie Catalog (at least the version 3.4.1)');
  237. end.
  238.